package com.reggie.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.reggie.DTO.SetmealDto;
import com.reggie.common.CustomException;
import com.reggie.entity.Setmeal;
import com.reggie.entity.SetmealDish;
import com.reggie.mapper.SetmealMapper;
import com.reggie.service.CategoryService;
import com.reggie.service.SetmealDishService;
import com.reggie.service.SetmealService;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.io.Serializable;
import java.util.List;
import java.util.stream.Collectors;

@Service
public class SetmealServiceImpl extends ServiceImpl<SetmealMapper, Setmeal> implements SetmealService {
    //    根据id回显修改信息
    @Autowired
    private CategoryService categoryService;
    @Autowired
    private SetmealDishService setmealDishService;

    public SetmealDto editMessage(Long id) {
//        通过该id查询到 套餐名称 价格
        Setmeal setmeal = this.getById(id);
//        拷贝给dto  因为dto继承了
        SetmealDto setmealDto = new SetmealDto();
        BeanUtils.copyProperties(setmeal, setmealDto);
//        此时dto已经把setmeal的基本信息得到了
//判断传过来的id与其对应的套餐菜品名
        LambdaQueryWrapper<SetmealDish> lqw = new LambdaQueryWrapper<>();
        lqw.eq(SetmealDish::getSetmealId, id);
//        因为相同的有多个所以用集合来存储
        List<SetmealDish> list = setmealDishService.list(lqw);
        setmealDto.setSetmealDishes(list);
//        setmealDto.categoryName("1234");
        return setmealDto;
    }

//    保存修改信息

    @Override
    @Transactional  //记得加事务注解 保证两表一致性
    public void editSave(SetmealDto setmealDto) {
//          先把基础数据自动更新
        this.updateById(setmealDto);
//           再把套餐菜品的信息也删除
//        把id相同的信息删除掉
        LambdaQueryWrapper<SetmealDish> lambdaQueryWrapper = new LambdaQueryWrapper<>();
        lambdaQueryWrapper.eq(SetmealDish::getSetmealId, setmealDto);
        setmealDishService.remove(lambdaQueryWrapper);
//        把新的赋值进去
        List<SetmealDish> setmealDishes = setmealDto.getSetmealDishes();
//        套餐菜品咏steam流来一一赋值id
        setmealDishes.stream().map(item -> {
            item.setSetmealId(setmealDto.getId());
            return item;
        }).collect(Collectors.toList());

    }

    //删除
    @Override
    public void deleSetmeal(List<Long> ids) {
        //查询套餐状态，确定是否可用删除
//        这些是错误的
//        Setmeal setmeal = this.getById((Serializable) ids);
//        Integer status = setmeal.getStatus();
//        if (status!=0){
//            throw
//        }
//   List类型的参数需要用querywrapper.in的方式去查询
        LambdaQueryWrapper<Setmeal> lambdaQueryWrapper = new LambdaQueryWrapper<>();
//        多条件查询   返回表中的id与参数ids相同的所有数据 包装为 list
        lambdaQueryWrapper.in(Setmeal::getId, ids);
//        查询出状态为1的  起售的数据
        lambdaQueryWrapper.eq(Setmeal::getStatus, 1);
//        当满足以上两个查询 都成立 此时需要统计查询出来的个数来判断是否有在售数据（不能删）
//        统计函数count
        int count = this.count(lambdaQueryWrapper);
        if (count > 0) {
            //如果不能删除抛出一个业务异常
            throw new CustomException("套餐正在售卖不能删除");
        }
        //如果可以删除，先删除套餐信息  然后套餐菜品信息
//        removeByIds()多个批量删除
        this.removeByIds(ids);
//        删套餐菜品
//此时因为该表主键id不是套餐id所以不能直接用byid来删除
//需要用条件查询
        LambdaQueryWrapper<SetmealDish> lambdaQueryWrapper1 = new LambdaQueryWrapper<>();
//        查询到了多个id相同的数据
        LambdaQueryWrapper<SetmealDish> setmealdish = lambdaQueryWrapper1.in(SetmealDish::getSetmealId, ids);
//删除
        setmealDishService.remove(setmealdish);

//还未运行过！！！
    }
}
